#include <stdio.h>
#include <arpa/inet.h> // 提供 htonl 和 htons 函数
#include <string.h>

void print_binary_ip(struct in_addr ipv4_addr) {
    unsigned char *bytes = (unsigned char *)&ipv4_addr;
    for (int i = 0; i < 4; i++) {
        for (int j = 7; j >= 0; j--) {
            // 打印每个字节的每一位
            printf("%d", (bytes[i] >> j) & 1);
        }
        if (i < 3) {
            printf("."); // 每个字节后面加上点分隔符
        }
    }
    printf("\n");
}

int ip_addr_convert() {
    // IPv4 示例
    const char *ipv4_str = "192.168.1.1";
    struct in_addr ipv4_addr;   // 用于存储二进制格式的 IPv4 地址

    // 将字符串格式的 IPv4 转换为二进制格式
    if (inet_pton(AF_INET, ipv4_str, &ipv4_addr) != 1) {
        perror("inet_pton (IPv4)");
        return 1;
    }
    printf("inet_pton (IPv4): 成功转换 IP %s\n", ipv4_str);

    // 打印二进制格式的 IPv4 地址
    printf("二进制格式的 IPv4 地址: ");
    print_binary_ip(ipv4_addr);

    // 将二进制格式的 IPv4 地址转换回字符串格式
    char ipv4_dst[INET_ADDRSTRLEN]; // INET_ADDRSTRLEN 是 IPv4 地址字符串的最大长度
    if (inet_ntop(AF_INET, &ipv4_addr, ipv4_dst, sizeof(ipv4_dst)) == NULL) {
        perror("inet_ntop (IPv4)");
        return 1;
    }
    printf("inet_ntop (IPv4): 二进制转字符串成功 %s\n", ipv4_dst);

    // IPv6 示例
    const char *ipv6_str = "2001:db8::1";
    struct in6_addr ipv6_addr;  // 用于存储二进制格式的 IPv6 地址

    // 将字符串格式的 IPv6 转换为二进制格式
    if (inet_pton(AF_INET6, ipv6_str, &ipv6_addr) != 1) {
        perror("inet_pton (IPv6)");
        return 1;
    }
    printf("inet_pton (IPv6): 成功转换 IP %s\n", ipv6_str);

    // 将二进制格式的 IPv6 地址转换回字符串格式
    char ipv6_dst[INET6_ADDRSTRLEN]; // INET6_ADDRSTRLEN 是 IPv6 地址字符串的最大长度
    if (inet_ntop(AF_INET6, &ipv6_addr, ipv6_dst, sizeof(ipv6_dst)) == NULL) {
        perror("inet_ntop (IPv6)");
        return 1;
    }
    printf("inet_ntop (IPv6): 二进制转字符串成功 %s\n", ipv6_dst);

    return 0;
}

int conver_test() {
    unsigned int host_order = 0x12345678; // 主机字节序（小端）
    unsigned int net_order = htonl(host_order); // 转为网络字节序（大端）

    printf("主机字节序（小端）: 0x%x\n", host_order);
    printf("网络字节序（大端）: 0x%x\n", net_order);

    return 0;
}
int main() {
    int x = 0x12345678;
    unsigned char *p = (unsigned char *)&x;

    if (*p == 0x78) {
        printf("小端字节序\n");
    } else if (*p == 0x12) {
        printf("大端字节序\n");
    } else {
        printf("未知字节序\n");
    }
    conver_test();
    ip_addr_convert();

    return 0;
}
